home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / DB_CLIPP / 0277.ZIP / WILDCP86.C < prev    next >
Text File  |  1986-02-28  |  4KB  |  224 lines

  1. /*
  2.  
  3. WILDEXP1.C - CP/M86 CI86 C version. Thanks to L. Zolman for the original
  4.         BDS C version.
  5.  
  6. */
  7.  
  8. #include    <stdio.h>
  9.  
  10. #define     MAXITEMS    200    /* max no. of items after expansion */
  11. #define     SEARCH_FIRST    17    /* BDOS calls */
  12. #define     SEARCH_NEXT    18
  13. #define     ERROR        -1
  14. #define     TRUE        1
  15. #define     FALSE        0
  16.  
  17. wildexp(oargcp, oargvp)
  18. int    *oargcp;        /* pointer to old argc */
  19. char    ***oargvp;        /* pointer to old argv */
  20. {
  21.     int    nargc;        /* new argc */
  22.     char    **nargv;    /* new argv */
  23.     char    **oargv;    /* old argv */
  24.     int    oargc;        /* old argc */
  25.     char    fcb[36];    /* fcb used for search for first/next calls */
  26.     char    dmapos;     /* value returned by search calls */
  27.     char    first_time;    /* used in search routine */
  28.     char    tmpfn[20],    /* temp filename buffer */
  29.         *tmpfnp;
  30.     char    *notfns[20];    /* list of !<afn> entries */
  31.     int    notcount;    /* count of entries in notfns */
  32.     char    cur_drive;    /* currently logged drive */
  33.     int    i,j,k;
  34.     char    *sbrk();
  35.     char    dma[128];
  36.     struct { unsigned int scs, sss, sds, ses;} segs;
  37.     struct { unsigned int ax,bx,cx,dx,si,di,ds,es;} srvi, srvo;
  38.  
  39.     cur_drive = bdos(25);
  40.     segread(&segs);
  41.     bdos(0x1a,(unsigned) &dma[0]);      /* set dma offset */
  42.     bdos(0x33,segs.sds);          /* set dma segment */
  43.  
  44.     oargv = *oargvp;
  45.     oargc = *oargcp;
  46.     nargc = 1;
  47.     notcount = 0;
  48.  
  49.     if ((nargv = sbrk(MAXITEMS * 2 + 2)) == NULL)
  50.         return ERROR;
  51.  
  52.     for (i = 1; i < oargc; i++)
  53.         {
  54.         upper(oargv[i]);
  55.         if (oargv[i][0] == '!')
  56.             {
  57.             if (i == 1)
  58.                 {
  59.                 oargv[oargc] = "*.*";
  60.                 oargc++;
  61.                 }
  62.             notfns[notcount++] = &oargv[i][1];
  63.             }
  64.         else if (!haswild(oargv[i]))
  65.             nargv[nargc++] = oargv[i];
  66.         else
  67.             {
  68.             setfcb(fcb,oargv[i]);
  69.             tmpfnp = tmpfn;
  70.             if ((tmpfn[1] = oargv[i][1]) == ':')
  71.                 {
  72.                 tmpfn[0] = toupper(oargv[i][0]);
  73.                 tmpfnp = tmpfn + 2;
  74.                 }
  75.  
  76.             first_time = TRUE;
  77.             while (1)
  78.                 {            /* find all matching files */
  79.                 srvi.cx = (first_time) ? SEARCH_FIRST : SEARCH_NEXT;
  80.                 srvi.ds = segs.sds;
  81.                 srvi.dx = (unsigned) &fcb[0];
  82.                 sysint(224, &srvi, &srvo);
  83.                 if((srvo.ax & 0x00ff) == 255)
  84.                     break;
  85.                 dmapos = srvo.ax & 0x00ff;
  86.                 first_time = FALSE;
  87.                 hackname(tmpfnp,dma+(dmapos*32));
  88.                 if ((nargv[nargc] = sbrk(strlen(tmpfn) + 1)) == NULL)
  89.                     return ERROR;
  90.                 strcpy(nargv[nargc++], tmpfn);
  91.                 }
  92.             }
  93.         }
  94.  
  95.     for (i = 0; i < notcount; i++)
  96.         for (j = 1; j < nargc; j++)
  97.             while (match(notfns[i],nargv[j],cur_drive))
  98.                 {
  99.                 if(j == --nargc)
  100.                     break;
  101.                 for (k = j; k < nargc; k++)
  102.                     nargv[k] = nargv[k+1];
  103.                 }
  104.     *oargcp = nargc;
  105.     *oargvp = nargv;
  106.     return (0);
  107. }
  108.  
  109. hackname(dest,source)
  110. char *dest, *source;
  111. {
  112.     int i,j;
  113.  
  114.     j = 0;
  115.  
  116.     for (i = 1; i < 9; i++)
  117.     {
  118.         if (source[i] == ' ') break;
  119.         dest[j++] = source[i];
  120.     }
  121.     if (source[9] != ' ')
  122.         dest[j++] = '.';
  123.  
  124.     for (i = 9; i < 12; i++)
  125.     {
  126.         if (source[i] == ' ') break;
  127.         dest[j++] = source[i];
  128.     }
  129.     dest[j] = '\0';
  130.     return dest;
  131. }
  132.  
  133. int haswild(fname)
  134. char *fname;
  135. {
  136.     char c;
  137.  
  138.     while (c = *fname++)
  139.         if (c == '*' || c == '?')
  140.             return TRUE;
  141.     return FALSE;
  142. }
  143.  
  144. int match(wildnam, filnam, cur_drive)
  145. char *wildnam, *filnam, cur_drive;
  146. {
  147.    char c;
  148.  
  149.    if (wildnam[1] != ':')
  150.    {
  151.     if (filnam[1] == ':')
  152.         if (filnam[0] - 'A' == cur_drive)
  153.             filnam += 2;
  154.         else
  155.             return FALSE;
  156.    }
  157.    else
  158.    {
  159.     if (filnam[1] != ':')
  160.         if (wildnam[0] - 'A' == cur_drive)
  161.             wildnam += 2;
  162.         else
  163.             return FALSE;
  164.    }
  165.  
  166.    while (c = *wildnam++)
  167.     if (c == '?')
  168.         if ((c = *filnam++) && c != '.')
  169.             continue;
  170.         else
  171.             return FALSE;
  172.     else if (c == '*')
  173.     {
  174.         while (c = *wildnam)
  175.         {    wildnam++;
  176.             if (c == '.') break;
  177.         }
  178.         while (c = *filnam)
  179.         {    filnam++;
  180.             if (c == '.') break;
  181.         }
  182.     }
  183.     else if (c == *filnam++)
  184.         continue;
  185.     else return FALSE;
  186.  
  187.    if (!*filnam)
  188.     return TRUE;
  189.    else
  190.     return FALSE;
  191. }
  192.  
  193. setfcb(fcb,fname)
  194. char *fcb, *fname;
  195. {
  196.     char *fcb_ptr, *makefcb();
  197.     int i;
  198.     int qflg =0;
  199.  
  200.     if((fcb_ptr = makefcb(fname)) == NULL)
  201.         return(0);
  202.     movmem(fcb_ptr, fcb, 36);
  203.     free(fcb_ptr);
  204.     for(i=1; i<12;i++)
  205.         {
  206.         if(fcb[i] == '*')
  207.         {
  208.         qflg = 1;
  209.         fcb[i] = '?';
  210.         continue;
  211.         }
  212.         if(qflg)
  213.         {
  214.         if(fcb[i] != ' ')
  215.             {
  216.             qflg =0;
  217.             continue;
  218.             }
  219.         fcb[i] = '?';
  220.         }
  221.         }
  222.     return(1);
  223. }
  224.